package pe.com.hermes.hermetic.web.controller.reportes;

import java.io.InputStream;

import java.io.OutputStream;

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;

import java.util.Map;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import net.sf.jasperreports.engine.JRDataSource;
import net.sf.jasperreports.engine.JasperRunManager;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
import net.sf.jasperreports.engine.JRException;

import org.apache.log4j.Logger;


import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFDataFormat;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import org.springframework.web.bind.annotation.SessionAttributes;

import pe.com.hermes.hermetic.beans.AuditBean;
import pe.com.hermes.hermetic.beans.EmpleadoBean;
import pe.com.hermes.hermetic.beans.SucursalBean;
import pe.com.hermes.hermetic.beans.TiposBean;
import pe.com.hermes.hermetic.beans.User;
import pe.com.hermes.hermetic.negocio.service.HermeticFacade;
import pe.com.hermes.hermetic.negocio.service.TablService;
import pe.com.hermes.hermetic.negocio.ultil.ConstantesHermetic;
import pe.com.hermes.hermetic.negocio.ultil.Util;
import pe.com.hermes.hermetic.web.controller.base.IController;
import pe.com.hermes.hermetic.web.controller.base.IWebOpciones;
import pe.com.hermes.hermetic.web.controller.consultas.ListarPedidoController;
import pe.com.hermes.hermetic.web.forms.HMF4019Form;
import pe.com.hermes.unidadesnegocio.comercial.entities.TarjetaEntity;
import pe.com.hermes.unidadesnegocio.comercial.factory.TarjetaEntityFactory;

@Controller
@SessionAttributes(value={"codOpci","desOpci","form"})
@RequestMapping("/mostrarHWF4019.html")
public class TarjetasRetenidasController implements IController {
  protected final static Logger logger = Logger.getLogger(ListarPedidoController.class);
  
  @Autowired
  private HermeticFacade servicioHermetic;
  @Autowired
  private TablService tablService;
  
  @RequestMapping(method=RequestMethod.GET)    
  protected String showForm(ModelMap model,HttpServletRequest request) throws Exception{
     HttpSession session = request.getSession(false); 
     User user = Util.getUser();
     if(!Util.hasRole("ROLE_HWF4019", user))
       return FORM_ACCESS_NULL_VIEW;
     HMF4019Form form = new HMF4019Form();
     form.setFormulario("HMR4019");
     session.setAttribute("chksSucu",null);
     String codSucuHtb = (String)request.getSession().getAttribute("sucursal");
     String nomClie = (String)request.getSession().getAttribute("nombreCliente");
     //form.setNomClie(nomClie);
     String []chksSucu= new String[30];
     chksSucu[0]=codSucuHtb;
     request.getSession(false).setAttribute("chksSucu",chksSucu);
     if (ConstantesHermetic.COD_SUCU_HTB_LIMA.equals(codSucuHtb)){
         model.put("esSucuPrincipal", true);
     }
     String fecha = servicioHermetic.getFechaHoy();
     form.setFechaDesde(fecha);
     form.setFechaHasta(fecha);
     
     AuditBean auditBean = new AuditBean(TARJ_RETE);
     servicioHermetic.inseAudit(auditBean);
     String codOpci = IWebOpciones.TARJ_RETE;
     String desOpci = servicioHermetic.getDesOpci(codOpci, request);
     model.put("codOpci",codOpci);
     model.put("desOpci",desOpci);
     model.put(FORM_KEY,form);
     return  FORM_REPO_TARJ_RETE_VIEW;
  }

    @RequestMapping(params="accion=verExcel")
    protected void verExcel(@ModelAttribute(FORM_KEY) HMF4019Form form,ModelMap model, HttpServletRequest request,HttpServletResponse response) throws Exception {
        String _codClie = (String)request.getSession().getAttribute("cliente");
        String _codSucuHtb = (String)request.getSession().getAttribute("sucursal");
        String[] chksSucu = (String[])request.getSession(false).getAttribute("chksSucu");
        if ("0".equals(form.getSucursal())) {
            chksSucu=new String[100];
            chksSucu[0]="0";
        }
        //Si esta marcado "TODOS", concatenar los codigos de todas las sucursales
        boolean todasSucu=false;
        for (int l=0;l<chksSucu.length;l++){
            if ("0".equals(chksSucu[l])){
              todasSucu=true;
            }
        }
        String[] chksSucuNuevo=null;
        if (todasSucu){
          List<SucursalBean> sucursales= servicioHermetic.getSucursalesNoTodos();
          if (sucursales!=null){
              chksSucuNuevo=new String[sucursales.size()];
              int cont=0;
              for (SucursalBean sucursal:sucursales){
                  chksSucuNuevo[cont++]=sucursal.getCodSucursal();
              }
          }
        }
        //Validacion de fecha de Publicacion
        List listFechaPublic = new ArrayList();  
        if (chksSucuNuevo!=null){
          String listCodSucu=Util.arrayToString(chksSucuNuevo,",");
          listFechaPublic = tablService.getFechaPublicacion("7",_codClie, listCodSucu);
          for (int i=0;i<listFechaPublic.size();i++){
              TiposBean fechaPublicacion = (TiposBean)listFechaPublic.get(i);
              for(int j=0; j<chksSucuNuevo.length;j++){
                  if((fechaPublicacion.getCodSucu().equals(chksSucuNuevo[j])) && ((fechaPublicacion.getFecPubl() == null  || fechaPublicacion.getFecPubl().equals("")) )){
                      chksSucuNuevo[j]=null;
                    }
            }    
          }
          chksSucu=chksSucuNuevo;        
        }
        
        String codSucu=Util.arrayToString(chksSucu,",");
        String codSucuHtb = _codSucuHtb;
        int codClie = Integer.parseInt(_codClie);        
        if (ConstantesHermetic.COD_SUCU_HTB_LIMA.equals(_codSucuHtb)) {
            codSucuHtb = codSucu;
        }
        form.setNomClie((String)request.getSession().getAttribute("nombreCliente"));
        List<TarjetaEntity> list = tablService.getListTjtasRetenidas(codClie, codSucuHtb, form.getFechaDesde(), form.getFechaHasta());
        form.setTarjetasRetenidas(list);
        HSSFWorkbook wb = new HSSFWorkbook(); 
        try {
            wb = tarjetasReteniasExcel(form);
        } catch (Exception e) {
            // TODO: Add catch code
            e.printStackTrace();
        }
        response.addHeader("Content-type", "application/vnd.ms-excel");
        response.addHeader("Content-Disposition", "attachment; filename=tarjetasretenidas.xls");
        response.setContentType("Content-type: application/vnd.ms-excel");
        
        response.setHeader("Cache-Control","cache"); // HTTP 1.1
        response.setHeader("Pragma","cache"); // HTTP 1.0
        response.setDateHeader ("Expires", -1);  
        
        OutputStream out = response.getOutputStream();
        wb.write(out);
        out.close();
    }
    @RequestMapping(params="accion=verPdf")
    protected void verPdf(@ModelAttribute(FORM_KEY) HMF4019Form form,ModelMap model, HttpServletRequest request, HttpSession session,HttpServletResponse response) throws Exception {
        String _codClie = (String)request.getSession().getAttribute("cliente");
        String _codSucuHtb = (String)request.getSession().getAttribute("sucursal");
        String[] chksSucu = (String[])request.getSession(false).getAttribute("chksSucu");
        if ("0".equals(form.getSucursal())) {
            chksSucu=new String[100];
            chksSucu[0]="0";
        }
        //Si esta marcado "TODOS", concatenar los codigos de todas las sucursales
        boolean todasSucu=false;
        for (int l=0;l<chksSucu.length;l++){
            if ("0".equals(chksSucu[l])){
              todasSucu=true;
            }
        }
        String[] chksSucuNuevo=null;
        if (todasSucu){
          List<SucursalBean> sucursales= servicioHermetic.getSucursalesNoTodos();
          if (sucursales!=null){
              chksSucuNuevo=new String[sucursales.size()];
              int cont=0;
              for (SucursalBean sucursal:sucursales){
                  chksSucuNuevo[cont++]=sucursal.getCodSucursal();
              }
          }
        }
        //Validacion de fecha de Publicacion
        List listFechaPublic = new ArrayList();  
        if (chksSucuNuevo!=null){
          String listCodSucu=Util.arrayToString(chksSucuNuevo,",");
          listFechaPublic = tablService.getFechaPublicacion("7",_codClie, listCodSucu);
          for (int i=0;i<listFechaPublic.size();i++){
              TiposBean fechaPublicacion = (TiposBean)listFechaPublic.get(i);
              for(int j=0; j<chksSucuNuevo.length;j++){
                  if((fechaPublicacion.getCodSucu().equals(chksSucuNuevo[j])) && ((fechaPublicacion.getFecPubl() == null  || fechaPublicacion.getFecPubl().equals("")) )){
                      chksSucuNuevo[j]=null;
                    }
            }    
          }
          chksSucu=chksSucuNuevo;        
        }
        
        String codSucu=Util.arrayToString(chksSucu,",");
        String codSucuHtb = _codSucuHtb;
        int codClie = Integer.parseInt(_codClie);        
        if (ConstantesHermetic.COD_SUCU_HTB_LIMA.equals(_codSucuHtb)) {
            codSucuHtb = codSucu;
        }
        String rutaJasper = session.getServletContext().getInitParameter("rutajasper");
        StringBuffer jasperPath = new StringBuffer(rutaJasper).append("/").append("tarjetasretenidas").append(".jasper");
        Map map = new HashMap();
        JRDataSource simpleDS;
        String fecha_srv = servicioHermetic.getFechaHoy();
        String hora_srv = servicioHermetic.getFecha2().substring(8, 13);
        //Collection list = TarjetaEntityFactory.getBeanCollection();//.getListTjtasRetenidas(codClie, codSucuHtb, form.getFechaDesde(), form.getFechaHasta());
        Collection list = tablService.getListTjtasRetenidas(codClie, codSucuHtb, form.getFechaDesde(), form.getFechaHasta());
        simpleDS = new JRBeanCollectionDataSource(list);
        EmpleadoBean jefeOperaciones = tablService.getEmplByPuesto(ConstantesHermetic.JEFE_OPERACIONES); 
        String rutaDireFirma = session.getServletContext().getInitParameter("rutaDireFirma");
        String nombreFirma = jefeOperaciones.getNombreArchivoFirma();
        StringBuffer rutaFirma = new StringBuffer(rutaDireFirma).append("/").append(nombreFirma);
        logger.info("rutaFirma: "+rutaFirma.toString());
        map.put("nomClie",session.getAttribute("nombreCliente"));
        map.put("fecha_srv",fecha_srv);
        map.put("hora_srv",hora_srv);
        map.put("contextPath",request.getSession().getServletContext().getRealPath("/"));
        map.put("rutaFirma",rutaFirma.toString());
        map.put("hora_srv",hora_srv);
        map.put("fec_emis_inic",form.getFechaDesde());
        map.put("fec_emis_finl",form.getFechaHasta());
        map.put("jefeoperaciones",jefeOperaciones.getNombre());
        ServletOutputStream servletOutputStream = response.getOutputStream();
        InputStream reportStream = session.getServletContext().getResourceAsStream(jasperPath.toString());
        
        byte[] bytes = null;        
        try {
            bytes = JasperRunManager.runReportToPdf(reportStream, map, simpleDS);
        } catch (JRException jre) {
            // TODO: Add catch code
            jre.printStackTrace();
        }
      catch (Exception e) {
                  // TODO: Add catch code
                  e.printStackTrace();
              }
        response.setHeader("Cache-Control","cache"); // HTTP 1.1
        response.setHeader("Pragma","cache"); // HTTP 1.0
        response.setDateHeader ("Expires", -1);         
        response.setContentType("application/pdf");
        response.addHeader("Content-Disposition", "inline; filename=Reporte.pdf");        
        response.setContentLength(bytes.length);         
        servletOutputStream.write(bytes, 0, bytes.length);
        servletOutputStream.flush();
        servletOutputStream.close();
    }
    
    public HSSFWorkbook tarjetasReteniasExcel(HMF4019Form form) throws Exception{
        int rowNum = 0;
        HSSFWorkbook wb = new HSSFWorkbook();
        HSSFSheet sheet = wb.createSheet("tarjetasretenidas");
        HSSFRow row = sheet.createRow((short)rowNum);rowNum++;
        //creacion de Estilos
        HSSFCellStyle cs = wb.createCellStyle();
        HSSFCellStyle cs2 = wb.createCellStyle();
        HSSFCellStyle cs3 = wb.createCellStyle();
        HSSFDataFormat df2 = wb.createDataFormat();
        cs3.setDataFormat(df2.getFormat("###"));
        
        HSSFFont f = wb.createFont();
        HSSFDataFormat df = wb.createDataFormat();
        df.getFormat("text");
        f.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
        cs.setFont(f);
        cs.setBorderBottom(HSSFCellStyle.BORDER_THIN);
        cs.setBorderTop(HSSFCellStyle.BORDER_THIN);
        cs2.setDataFormat(HSSFDataFormat.getBuiltinFormat("text"));
        cs3.setFont(f);
        cs2.setDataFormat(HSSFDataFormat.getBuiltinFormat("#,##0.00"));
  
        //CABECERA
        row = sheet.createRow((short)rowNum);rowNum++;
        //titulo
        row.createCell(3).setCellValue("TARJETAS RETENIDAS");
        row.getCell(3).setCellStyle(cs3);
        //datos
        row = sheet.createRow((short)rowNum);rowNum++;
        row = sheet.createRow((short)rowNum);rowNum++;
        row.createCell(0).setCellValue("CLIENTE:");
        row.getCell(0).setCellStyle(cs3);
        row.createCell(1).setCellValue(form.getNomClie());
        
        row = sheet.createRow((short)rowNum);rowNum++;
        row.createCell(0).setCellValue("FECHA INICIAL");
        row.getCell(0).setCellStyle(cs3);
        row.createCell(1).setCellValue(form.getFechaDesde());
        row.createCell(2).setCellValue("FECHA FINAL");
        row.getCell(2).setCellStyle(cs3);
        row.createCell(3).setCellValue(form.getFechaHasta());                
        
        row = sheet.createRow((short)rowNum);rowNum++;
        row = sheet.createRow((short)rowNum);rowNum++;
        //FIN CABECERA         
        row = sheet.createRow((short)rowNum);rowNum++;
        int colCabecera = 0;
        row.createCell(colCabecera).setCellValue("NRO DE TARJETA");
        row.getCell(colCabecera).setCellStyle(cs);colCabecera++;
        row.createCell(colCabecera).setCellValue("CODIGO DE CAJERO");
        row.getCell(colCabecera).setCellStyle(cs);colCabecera++;
        row.createCell(colCabecera).setCellValue("DESCRIPCION CAJERO");
        row.getCell(colCabecera).setCellStyle(cs);colCabecera++;
        row.createCell(colCabecera).setCellValue("FECHA EMISION");
        row.getCell(colCabecera).setCellStyle(cs);colCabecera++;
        row.createCell(colCabecera).setCellValue("BANCO");
        row.getCell(colCabecera).setCellStyle(cs);colCabecera++;
        row.createCell(colCabecera).setCellValue("SUCURSAL");
        row.getCell(colCabecera).setCellStyle(cs);colCabecera++;
             
        int count = 0;
        int col = 0;
        for (TarjetaEntity tarjeta : form.getTarjetasRetenidas() ) {  
            count++;
            col=0;
            row = sheet.createRow((short)rowNum);rowNum++;            
            row.createCell(col).setCellValue(tarjeta.getNumTarj()==null?"":String.valueOf(tarjeta.getNumTarj()));
              if (tarjeta.getNumTarj()!=null)
                row.getCell(col).setCellStyle(cs3);
            col++;
            row.createCell(col).setCellValue(tarjeta.getPuntoRete().getCodPunt());col++;
            row.createCell(col).setCellValue(tarjeta.getPuntoRete().getDesPunt());col++;
            row.createCell(col).setCellValue(tarjeta.getFecRete());col++;
            row.createCell(col).setCellValue(tarjeta.getPuntoRete().getCliente().getNomClie());col++;
            row.createCell(col).setCellValue(tarjeta.getPuntoRete().getSucuHtb().getDesSucuHtb());col++;
        }
        
        for (int x=0;x<col;x++){
            if (x==2 || x==4){
                sheet.setColumnWidth(x,10000);
            }
            else{
                sheet.setColumnWidth(x,4500);   
            }              
        }
        
        return wb;
    }
}
